Mise à jour le 18/11/2021
Simuler le mouvement de la souris

Simuler le mouvement de la souris

Dans le cas où vous avez besoin que le curseur de votre souris soit toujours actif à l'écran (afin d'éviter qu'un programme externe se mette en veille par exemple s'il ne détecte plus la souris), voici un petit script qui fonctionne sous linux.

💣️Ce programme n'est pas optimisé du tout et ne suit pas vraiment les bonnes pratiques.


1. Prérequis

Le binaire linux "xdotool" doit être installé.

xdotool -v
# Sortie : 
# xdotool version 3.20160805.1


2. Le code à enregistrer dans le fichier simulation.php

Il suffit d'enregistrer le bout de code qui suit et de le lancer directement dans le terminal.

<?php
/**
 * Moves the cursor in case the user does not use it during inactivity time.
 *
 */
$defaultInactivityTime = 240;
$inactivityTime = $defaultInactivityTime; // Time in SECONDES in wich the user is considered as inactive.


function isUserMove()
{
    $mouseLocation = getMouseLocation();
    if ($mouseLocation['x'] > 1) {
        return true;
    }

    return false;
}

/**
 * Move the cursor in the screen.
 */
function simulateMouseMove()
{
    for ($i = 1; $i < 800; $i++) {

        // Stop the process if the user moves the cursor
        if ($i > 5) {
            if (isUserMove()) {
                return false;
            }
        }

        system('xdotool mousemove 1 '.$i);
    }
    for ($i = 800; $i > 1; $i--) {
        system('xdotool mousemove 1 '.$i);

        // Stop the process if the user moves the cursor
        if ($i > 5) {
            $mouseLocation = getMouseLocation();
            if (isUserMove()) {
                return false;
            }
        }
    }

    return true;
}


function getMouseLocation()
{
    $mouseLocation = exec('xdotool getmouselocation 2>&1 | sed -rn \'${s/x:([0-9]+) y:([0-9]+) .*/\1 \2/p}\'');

    $mouseCoordonates = explode(' ', $mouseLocation);

    if (count($mouseCoordonates) === 2) {
       return ['x' => $mouseCoordonates[0], 'y' => $mouseCoordonates[1]];
    }

    return null;
}

function echoState($message, $currentMouseLocation, $color = 'normal')
{
    $redColor = "\033[33m";
    $normalColor = "\033[0m";
//    echo "\ec";
    if ($color == 'red') {
        $currentColor = $redColor;
            $currentModeMessage= '/!\ SECURITY MODE /!\ ';
    } else {
        if (isUserMove()) {
            $currentColor = $normalColor;
            $currentModeMessage= '';
        } else {
            $currentColor = $redColor;
            $currentModeMessage= '/!\ SECURITY MODE /!\ ';
        }
    }


    echo sprintf("%s[%s]{x=%s,y=%s} %s%s".PHP_EOL,
        $currentColor,
        date('Y-m-d H:i:s'),
        str_pad($currentMouseLocation['x'], 4, " " , STR_PAD_LEFT),
        str_pad($currentMouseLocation['y'], 4, " " , STR_PAD_LEFT),
        $currentModeMessage,
        $message
    );
}



$lastState = [
    'time' => time(),
    'mouse_location' => null,
];


$simulationIsActive = false;
while(true) {
    $currentMouseLocation = getMouseLocation();

    if (!is_null($currentMouseLocation)) {
        if (!is_null($lastState['time']) && !is_null($lastState['mouse_location'])) {

            // Detects if the mouse is moved since the last mouvement.
            if (($lastState['mouse_location']['x'] === $currentMouseLocation['x']) &&
                ($lastState['mouse_location']['y'] === $currentMouseLocation['y'])
            ) {
                // Detects if the current user is inactive.
                $diffTimeSinceLastMouvement = time() - $lastState['time'];
                $timeLeftBeforeSimulating = $inactivityTime - $diffTimeSinceLastMouvement;
                if (($lastState['time'] + $inactivityTime) < time()) {
                    echoState('Simulate mouse move !', $currentMouseLocation, 'red');
                    $mouseSimulation = simulateMouseMove();
                    if (false === $mouseSimulation) {
                        // If the user interrupts the simulation.
                        // Reset the inactivity delay.
                        $inactivityTime = $defaultInactivityTime;
                        $simulationIsActive = false;
                    } else {
                        // Is the user is really inactive, reduce the delay.
                        $inactivityTime = rand(5, 30);
                        $simulationIsActive = true;
                    }
                    $lastState['time'] = time();
                } else {
                    echoState(sprintf('No mouse move since %s seconde(s). %s secondes before simulating',
                            $diffTimeSinceLastMouvement,
                            $timeLeftBeforeSimulating
                        ),
                        $currentMouseLocation
                    );
                }
            } else {
                echoState('The mouse has been moved !', $currentMouseLocation);
                $lastState['time'] = time();
            }
        }

        $lastState['mouse_location'] = $currentMouseLocation;
    }

    sleep(1);
}